// YOLO11_SEG_RDK.hpp
#ifndef YOLOS_EDGEPLATFORM_YOLO11_SEG_RDK_HPP
#define YOLOS_EDGEPLATFORM_YOLO11_SEG_RDK_HPP

/**
 * @file YOLO11_SEG_RDK.hpp
 * @brief YOLO11 实例分割检测器（D-Robotics RDK 平台，BPU 硬件加速）
 *
 * 本头文件提供了针对 D-Robotics RDK X5 BPU（Brain Processing Unit）优化的
 * YOLO11 实例分割的 header-only 实现。
 *
 * 核心特性：
 * - 单头文件设计，易于集成
 * - BPU 硬件加速（通过 libDNN API）
 * - 支持 RGB (NCHW) / NV12 (YUV420SP) 输入格式自动检测
 * - DFL (Distribution Focal Loss) 后处理用于 bbox 回归
 * - Mask 生成：mce (mask coefficients) × proto (prototype masks)
 * - 可配置的预处理方式（Resize/LetterBox）
 * - RAII 资源管理（自动释放 BPU 资源）
 * - 继承自 YOLO8SegDetector（共享相同的后处理逻辑）
 *
 * 模型说明：
 * YOLO11-Seg 是 YOLOv8-Seg 的改进版本，主要区别：
 * - 模型架构更新（C3k2, C2PSA 等新模块）
 * - 检测精度和速度都有提升
 * - 后处理逻辑与 YOLOv8-Seg 完全相同（输出格式一致）
 *
 * 模型要求：
 * - 输入: NCHW-RGB/NV12, (1, 3, H, W), int8/int16 量化
 * - 输出: 10 个张量
 *   - 3 个尺度 (stride 8/16/32), 每个尺度 3 个输出:
 *     - cls[0,3,6]: (1, H//s, W//s, CLASSES_NUM) [NONE, float32]
 *     - bbox[1,4,7]: (1, H//s, W//s, 64) [SCALE, int32]
 *     - mce[2,5,8]: (1, H//s, W//s, 32) [SCALE, int32] - mask coefficients
 *   - proto[9]: (1, H//4, W//4, 32) [NONE/SCALE, float32/int16] - proto masks
 *
 * 输出顺序（需自动确定）：
 *   stride=8:  cls_8, bbox_8, mce_8   (小目标)
 *   stride=16: cls_16, bbox_16, mce_16 (中目标)
 *   stride=32: cls_32, bbox_32, mce_32 (大目标)
 *   proto:     proto_mask (H/4, W/4, 32)
 *
 * Mask 生成流程：
 *   1. 检测: DFL 解码 bbox，提取 32 维 mask coefficients
 *   2. NMS 筛选
 *   3. 对每个保留的检测: mask = sigmoid(mce @ proto)
 *   4. 下采样 mask 坐标映射: mask 空间 (H/4×W/4) → 原图空间
 *   5. 裁剪 mask 到 bbox 范围
 *   6. 上采样到原图尺寸
 *
 * 使用示例：
 * @code
 * YOLO11SegDetector detector("yolo11n_seg.bin", "coco.names");
 * cv::Mat image = cv::imread("test.jpg");
 * auto results = detector.detect(image, 0.25f, 0.7f, 0.5f);
 * @endcode
 *
 * 作者: FANKYT
 * 日期: 2025
 */

#include "seg/YOLO8_SEG_RDK.hpp"

namespace yolos_edgeplatform {

/**
 * @brief YOLO11 实例分割检测器实现（RDK X5 平台）
 *
 * 本类继承自 YOLO8SegDetector，因为 YOLO11-Seg 和 YOLOv8-Seg 的后处理逻辑完全相同。
 * 主要区别在于模型架构的改进，但输出格式和后处理流程保持一致。
 */
class YOLO11SegDetector : public YOLO8SegDetector {
public:
    /**
     * @brief 构造函数 - 加载 BPU 模型并初始化检测器
     *
     * @param modelPath .bin 模型文件路径
     * @param labelsPath 类别名称文件路径（每行一个类别）
     * @param numClasses 检测类别数量（默认 80，COCO 数据集）
     * @param reg DFL 回归 bins（默认 16）
     * @param maskCoeffs Mask 系数数量（默认 32）
     */
    YOLO11SegDetector(const std::string &modelPath,
                      const std::string &labelsPath,
                      int numClasses = 80,
                      int reg = 16,
                      int maskCoeffs = 32)
        : YOLO8SegDetector(modelPath, labelsPath, numClasses, reg, maskCoeffs) {

        // 打印 YOLO11 特定的初始化信息
        std::cout << "[INFO] ========================================" << std::endl;
        std::cout << "[INFO] YOLO11-Seg Detector Initialized" << std::endl;
        std::cout << "[INFO] Based on YOLOv8-Seg architecture" << std::endl;
        std::cout << "[INFO] Improvements: Better accuracy & speed" << std::endl;
        std::cout << "[INFO] Post-processing: Same as YOLOv8-Seg" << std::endl;
        std::cout << "[INFO] ========================================" << std::endl;
    }

    /**
     * @brief 析构函数
     *
     * 资源释放由父类 YOLO8SegDetector 自动处理
     */
    ~YOLO11SegDetector() override = default;

    /**
     * @brief 对输入图像执行实例分割检测
     *
     * 直接调用父类的 detect 方法，因为后处理逻辑完全相同。
     *
     * @param image 输入图像 (BGR 格式)
     * @param confThreshold 置信度阈值 (默认 0.25)
     * @param nmsThreshold NMS IoU 阈值 (默认 0.7)
     * @param maskThreshold Mask 二值化阈值 (默认 0.5)
     * @return std::vector<Segmentation> 实例分割结果
     */
    std::vector<Segmentation> detect(const cv::Mat &image,
                                     float confThreshold = 0.25f,
                                     float nmsThreshold = 0.7f,
                                     float maskThreshold = 0.5f) override {
        // 直接调用父类实现，因为 YOLO11-Seg 和 YOLOv8-Seg 的后处理逻辑完全相同
        return YOLO8SegDetector::detect(image, confThreshold, nmsThreshold, maskThreshold);
    }

    // 其他方法（getInputSize, getNumClasses, getClassNames, setPreprocessType）
    // 都直接继承自父类 YOLO8SegDetector，无需重新实现
};

/**
 * @brief YOLO11-Seg 与 YOLOv8-Seg 的区别说明
 *
 * 架构改进（YOLO11）：
 * 1. C3k2 模块：改进的 C3 模块，更少的参数，更高的效率
 * 2. C2PSA 模块：引入 PSA (Position-Sensitive Attention) 机制
 * 3. 更优的特征融合策略
 * 4. 改进的损失函数权重
 *
 * 相同点：
 * 1. 输入格式：RGB (NCHW) / NV12 (YUV420SP) 自动检测
 * 2. 输出格式：10 个张量（3 个尺度 × 3 个输出 + 1 个 proto mask）
 * 3. 后处理流程：DFL 解码、Mask 生成、NMS
 * 4. Mask 生成方式：mask = sigmoid(mce @ proto)
 *
 * 性能对比（官方数据，以 640×640 为例）：
 * - YOLOv8n-seg: mAP 36.7%, 速度 ~12ms/img (A100)
 * - YOLO11n-seg: mAP 38.9%, 速度 ~10ms/img (A100)
 * - YOLO11 相比 YOLOv8 精度提升约 2-3%，速度提升约 15-20%
 *
 * 使用建议：
 * - 如果需要更高的精度和速度，优先使用 YOLO11-Seg
 * - 如果已有 YOLOv8-Seg 模型且满足需求，无需升级
 * - 两者的代码接口完全兼容，可直接替换模型文件
 *
 * RGB/NV12 自动检测说明：
 * - 构造函数中自动检测模型输入格式（RGB 或 NV12）
 * - preprocess() 根据检测结果自动选择预处理方法：
 *   - RGB 模式：letterBox/resize → BGR (保留,在 inference 转 RGB)
 *   - NV12 模式：letterBox/resize → BGR2YUV_I420 → I420转NV12
 * - inference() 根据检测结果自动选择数据处理方式：
 *   - RGB 模式：分配 3*H*W 内存, BGR→RGB + NCHW + 量化(u8-128)
 *   - NV12 模式：分配 1.5*H*W 内存, 直接拷贝 NV12 数据
 * - 用户无需关心模型的输入格式，代码会自动适配
 */

} // namespace yolos_edgeplatform

#endif // YOLOS_EDGEPLATFORM_YOLO11_SEG_RDK_HPP
